package com.xuecheng.media.service;

import com.sun.org.apache.xpath.internal.operations.Bool;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.base.model.RestResponse;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFIleParamDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.media.model.po.MediaProcess;

import java.io.File;
import java.util.List;

/**
 * @author Mr.M
 * @version 1.0
 * @description 媒资文件管理业务类
 * @date 2022/9/10 8:55
 */
public interface MediaFileService {

    /**
     * 根据媒资文件id查询媒资文件信息
     * @param mediaId
     * @return
     */
    MediaFiles getFileById(String mediaId);

    /**
     * @param pageParams          分页参数
     * @param queryMediaParamsDto 查询条件
     * @return com.xuecheng.base.model.PageResult<com.xuecheng.media.model.po.MediaFiles>
     * @description 媒资文件查询方法
     * @author Mr.M
     * @date 2022/9/10 8:57
     */
    public PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传文件
     *
     * @param companyId          机构id
     * @param uploadFIleParamDto 文件信息
     * @param localFilePath      文件本地路径
     * @param objectName         如果传入objectname要按objectname的目录去存储，如果不传就按年月日目录去存储
     * @return UploadFileResultDto
     */
    public UploadFileResultDto uploadFile(Long companyId, UploadFIleParamDto uploadFIleParamDto, String localFilePath,String objectName);

    /**
     * 由于在一个非事务的方法内调用一个事务方法，事务无法控制，因此需要将service本身注入为代理对象
     * 但由于事务方法并没有暴露为接口，代理对象无法进行调用，因此需要在此处将方法暴露为接口
     *
     * @param companyId
     * @param fileMd5
     * @param uploadFIleParamDto
     * @param bucket_mdiafiles
     * @param objectName
     * @return
     */
    MediaFiles addMediaFilesToDb(Long companyId, String fileMd5, UploadFIleParamDto uploadFIleParamDto, String bucket_mdiafiles, String objectName);

    /**
     * 检查文件是否存在
     *
     * @param fileMd5 文件的md5
     * @return true 文件存在 false 文件不存在
     */
    public RestResponse<Boolean> checkFile(String fileMd5);

    /**
     * 检查分块是否存在
     *
     * @param fileMd5    文件的md5
     * @param chunkIndex 分块序号
     * @return true 分块存在 false 分块不存在
     */
    public RestResponse<Boolean> checkChunk(String fileMd5, int chunkIndex);

    /**
     * 上传分块
     *
     * @param fileMd5            文件md5
     * @param chunk              分块序号
     * @param localChunkFilePath 分块文件本地路径
     * @return
     */
    public RestResponse uploadChunk(String fileMd5, int chunk, String localChunkFilePath);

    /**
     * 合并分块
     *
     * @param companyId          机构id
     * @param fileMd5            文件md5
     * @param chunkTotal         分块总和
     * @param uploadFIleParamDto 文件信息
     * @return
     */
    public RestResponse mergeChunks(Long companyId, String fileMd5, int chunkTotal, UploadFIleParamDto uploadFIleParamDto);

    /**
     * 从minio下载视频
     *
     * @param bucket     桶
     * @param objectName 对象存储路径
     * @return 下载的视频
     */
    public File downloadFileFromMinIo(String bucket, String objectName);

    /**
     * 将文件上传到minio
     *
     * @param localFilePath 本地文件路径
     * @param mimeType      媒体文件类型
     * @param bucket        桶
     * @param objectName    对象名
     * @return
     */
    public boolean addMediaFilesToMinIo(String localFilePath, String mimeType, String bucket, String objectName);
}
